package Contas
import org.springframework.security.ui.webapp.AuthenticationProcessingFilter

class UsuarioComumController {

	static String ddd = "";
	static String telefoneParte1 = "";
	static String telefoneParte2 = "";
	
    static allowedMethods = [save: "POST", update: "POST", delete: "POST"]
	def authenticateService
	def tiposUsuario = TipoAdministrador.executeQuery("select tipo from TipoUsuario")
	def tiposProjeto = Projeto.executeQuery("select nome from Projeto")

    def index = {
        redirect(action: "show", params: params)
    }

    def list = {
        params.max = Math.min(params.max ? params.int('max') : 10, 100)
        [usuarioComumInstanceList: UsuarioComum.list(params), usuarioComumInstanceTotal: UsuarioComum.count()]
    }

    def create = {
        [person: new UsuarioComum(params), authorityList: Permissao.list(),tiposUsuario:tiposUsuario, tiposProjeto: tiposProjeto, ddd:ddd, telefoneParte1:telefoneParte1, telefoneParte2:telefoneParte2]
    }

    def save = {
        def person = new UsuarioComum()
		
		person.properties = params
		
		if (params.tipo[0].toString().equals("Novo Tipo")){
			def novoTipo = new TipoUsuario(tipo: params.tipo[1].toString())
			
			if (novoTipo.save()){
				person.properties.tipo = params.tipo[1].toString()
			}else{
				person.properties.tipo = ''
			}
		   
	   }else {
		   person.properties.tipo = params.tipo[0].toString()
	   }
	   
	   def telefoneInstance = new Telefone()
	   
	   telefoneInstance.ddd = params.ddd
	   telefoneInstance.telefoneParte1 = params.telefoneParte1
	   telefoneInstance.telefoneParte2 = params.telefoneParte2
	   person.telefone = telefoneInstance.toString()
	 
	   if (!Telefone.isNumb(person.telefone) || !(person.telefone.length() == 10)){
		 
		   telefoneInstance.ddd =''
		   telefoneInstance.telefoneParte1 =''
		   telefoneInstance.telefoneParte2 = ''
	   }
	   
	   if (params.projeto[0].toString().equals("Novo Projeto")){
		   def novoProjeto = new Projeto(nome: params.projeto[1].toString())
		   
		   if (novoProjeto.save()){
			   person.properties.projeto = params.projeto[1].toString()
		   }else{
			   person.properties.projeto = ''
		   }
		  
	  }else {
		  person.properties.projeto = params.projeto[0].toString()
	  }
	   
	  
		
		if (person.save()) {
			telefoneInstance.save()
			if (telefoneInstance.id != null){
				person.telefoneId = telefoneInstance.id
			}
			person.passwd = authenticateService.encodePassword(params.passwd)
			addRoles(person)
                        flash.message = "${message(code: 'default.created.message', args: [message(code: 'usuarioComum.label', default: 'UsuarioComum'), person.id])}"
			redirect action: show, id: person.id
		}
		else {
			person.passwd = ''
			render view: 'create', model: [authorityList: Permissao.list(), usuarioComumInstance: person, tiposUsuario:tiposUsuario, tiposProjeto: tiposProjeto, telefoneInstance:telefoneInstance]
		}
    }

    def show = {
		def username = session[AuthenticationProcessingFilter.SPRING_SECURITY_LAST_USERNAME_KEY]
		Usuario user = Usuario.findByUsername(username)
		def usuarioComumInstance
		def String tipo
		
		if (Administrador.get(user.id)==null){
			tipo = "Usuario"
			usuarioComumInstance = UsuarioComum.get(user.id)
		}else{
			tipo = "Admin"
			usuarioComumInstance = UsuarioComum.get(params.id)
		}
		def telefone = Telefone.get(usuarioComumInstance.telefoneId)
		
        if (!usuarioComumInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'usuarioComum.label', default: 'UsuarioComum'), params.id])}"
            redirect(action: "list")
        }
        else {
			if (telefone != null){
				[usuarioComumInstance: usuarioComumInstance, tipo:tipo, telefone:telefone.formatFone()]
			}else{
			[usuarioComumInstance: usuarioComumInstance, tipo:tipo, telefone:telefone]
			}
            
        }
    }

    def edit = {
		
        def username = session[AuthenticationProcessingFilter.SPRING_SECURITY_LAST_USERNAME_KEY]
		Usuario user = Usuario.findByUsername(username)
		def usuarioComumInstance
		def String tipo
		
		if (Administrador.get(user.id)==null){
			tipo = "Usuario"
			usuarioComumInstance = UsuarioComum.get(user.id)
		}else{
			tipo = "Admin"
			usuarioComumInstance = UsuarioComum.get(params.id)
		}
		def telefoneInstance = Telefone.get(usuarioComumInstance.telefoneId)
        if (!usuarioComumInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'usuarioComum.label', default: 'UsuarioComum'), params.id])}"
            redirect(action: "list")
        }
        else {
            return [usuarioComumInstance: usuarioComumInstance, tiposUsuario:tiposUsuario, tiposProjeto: tiposProjeto, tipo:tipo, telefoneInstance:telefoneInstance]
        }
    }

    def update = {
        def usuarioComumInstance = UsuarioComum.get(params.id)
		def telefoneInstance = Telefone.get(usuarioComumInstance.telefoneId)
		if (authenticateService.encodePassword(usuarioComumInstance.passwd) != authenticateService.encodePassword(params.senha)){
			usuarioComumInstance.passwd = authenticateService.encodePassword(params.senha)
		}
	
		if (params.tipo[0].toString().equals("Novo Tipo")){
			def novoTipo = new TipoUsuario(tipo: params.tipo[1].toString())
			
			if (novoTipo.save()){
				params.tipo = novoTipo.tipo.toString()
			}else{
				params.tipo = ''
			}
		   
	   }else {
		  params.tipo = params.tipo[0].toString()
	   }
	   
	   if (params.projeto[0].toString().equals("Novo Projeto")){
		   def novoProjeto = new Projeto(nome: params.projeto[1].toString())
		   
		   if (novoProjeto.save()){
			   params.projeto = novoProjeto.nome.toString()
		   }else{
			   params.projeto = ''
		   }
		  
	  }else {
		 params.projeto = params.projeto[0].toString()
	  }
	  if (telefoneInstance!=null){
		  telefoneInstance.ddd = params.ddd
		  telefoneInstance.telefoneParte1 = params.telefoneParte1
		  telefoneInstance.telefoneParte2 = params.telefoneParte2
		  usuarioComumInstance.telefone = telefoneInstance.toString()
	  }
	  if (!Telefone.isNumb(usuarioComumInstance.telefone) || !usuarioComumInstance.telefone.length() == 10){
		  telefoneInstance.ddd =''
		  telefoneInstance.telefoneParte1 =''
		  telefoneInstance.telefoneParte2 = ''
	  }

		
        if (usuarioComumInstance) {
            if (params.version) {
                def version = params.version.toLong()
                if (usuarioComumInstance.version > version) {
                    
                    usuarioComumInstance.errors.rejectValue("version", "default.optimistic.locking.failure", [message(code: 'usuarioComum.label', default: 'UsuarioComum')] as Object[], "Another user has updated this UsuarioComum while you were editing")
                    render(view: "edit", model: [usuarioComumInstance: usuarioComumInstance])
                    return
                }
            }
            usuarioComumInstance.properties = params
            if (!usuarioComumInstance.hasErrors() && usuarioComumInstance.save(flush: true)) {
                flash.message = "Usuario $usuarioComumInstance.username atualizado com sucesso."
                redirect(action: "show", id: usuarioComumInstance.id)
            }
            else {
                render(view: "edit", model: [usuarioComumInstance: usuarioComumInstance, telefoneInstance:telefoneInstance, tiposUsuario:tiposUsuario, tiposProjeto:tiposProjeto])
            }
        }
        else {
            flash.message = "Usuario nao encontrado."
            redirect(action: "list")
        }
    }
	
	private void addRoles(person) {
		Permissao.findByAuthority("ROLE_USUARIO").addToPeople(person)
}

    def delete = {
        
		def person = UsuarioComum.get(params.id)
		if (person) {
			def authPrincipal = authenticateService.principal()
			//avoid self-delete if the logged-in user is an admin
			if (!(authPrincipal instanceof String) && authPrincipal.username == person.username) {
				flash.message = "You can not delete yourself, please login as another admin and try again"
			}
			else {
				//first, delete this person from People_Authorities table.
				Permissao.findAll().each { it.removeFromPeople(person) }
				person.delete()
				flash.message = "Usuario $person.userRealName excluido do sistema."
			}
		}
		else {
			flash.message = "Usuario not found with id $params.id"
		}

		redirect action: list
    }

}
